%% @author Final
%% @doc @todo Add description to maxteilsummeRekzugr.


-module(maxteilsummeRekzugr).

%% ====================================================================
%% API functions
%% ====================================================================
-export([maxteilsummeRek/1]).



%% ====================================================================
%% Internal functions
%% ====================================================================

cutTail(L) -> lists:sublist(L,length(L)-1).

vonLinksMax(L, Von, Bis, Zugr) -> vonLinksMax(L, 0, 0, Von, Bis + 1, {0,0}, Zugr).
vonLinksMax([], Max, _, _Von, _Bis, VonBis, Zugr) -> {Max, VonBis, Zugr};
vonLinksMax(L, Max, Summe, Von, Bis, VonBis, Zugr) -> case lists:sum(L) > Max of
							  true -> vonLinksMax(cutTail(L), lists:sum(L), Summe + lists:sum(L), Von, Bis - 1, {Von, Bis - 1}, Zugr + 4);
				     		  false -> vonLinksMax(cutTail(L), Max, Summe + lists:sum(L), Von, Bis - 1, VonBis, Zugr + 3) end.
	
vonRechtsMax([H|T], Von, Bis, Zugr) -> vonRechtsMax([H|T], 0, 0, Von, Bis, {0,0}, Zugr).
vonRechtsMax([], Max1, _, _Von, _Bis, VonBis, Zugr) -> {Max1, VonBis, Zugr};
vonRechtsMax([H|T], Max1, Summe1, Von, Bis, VonBis, Zugr) -> case lists:sum([H|T]) > Max1 of
							  true -> vonRechtsMax(T, lists:sum([H|T]), Summe1 + lists:sum([H|T]), Von + 1, Bis, {Von, Bis}, Zugr + 4);
				     		  false -> vonRechtsMax(T, Max1, Summe1 + lists:sum([H|T]), Von + 1, Bis, VonBis, Zugr + 3) end.


maxteilsummeRek([]) -> {0, 0, 0, 0};
maxteilsummeRek(L) -> maxteilsummeRek(L, 1, length(L), 1).
maxteilsummeRek(L, Von, Bis, Zugr) -> if length(L) =:= 1 -> {max(hd(L),0), Von, Bis, Zugr + 2};
						true -> maxteilsummeRek(hd(splitList(L)), lists:flatten(tl(splitList(L))), Von, Bis, Zugr + 2) end.
maxteilsummeRek(H, T, Von, Bis, Zugr) ->
		{Sum2, Von2, Bis2, Zugr2} = maxteilsummeRek(T, Von + length(H), Bis, Zugr + 2),
		{Sum1,Von1,Bis1, Zugr1} = maxteilsummeRek(H, Von, Bis - length(T), Zugr + 2),
		{MaxR, {VonR,BisR}, ZugrR} = vonRechtsMax(H, Von, Bis - length(T), Zugr + 2),
		{MaxL, {VonL,BisL}, ZugrL} = vonLinksMax(T, Von + length(H), Bis, Zugr + 2),
		SumM = MaxR + MaxL,
		ZugrM = ZugrR + ZugrL,
	    if 
		   (Sum1 >= Sum2) and (Sum1 >= SumM) -> SumErg = Sum1, VonErg = Von1, BisErg = Bis1, ZugrErg = Zugr1;
		   (Sum2 >= Sum1) and (Sum2 >= SumM) -> SumErg = Sum2, VonErg = Von2, BisErg = Bis2, ZugrErg = Zugr2;
		   (SumM >= Sum2) and (SumM >= Sum1) -> SumErg = SumM, VonErg = VonR, BisErg = BisL, ZugrErg = ZugrM
		end,
		{SumErg,VonErg,BisErg, ZugrErg}.
							
splitList(L) -> tuple_to_list(lists:split(round(length(L)/2), L)).			
